昨天,我們在 user 登入的時候,發出了 jwt token,他的格式長得像這樣
{
"message": "Login successful!",
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNzI4MzEwMzY3LCJpYXQiOjE3MjgzMDY3NjcsImp0aSI6IjRkZDY1ZWFkYjg0NTQwY2I5ODdjNDIyNWU5NTJiZjA5IiwidXNlcl9pZCI6Mn0.2xAGjfVLrE0lOBQW8DxQtdwXgCMSV8NZhYlPtmqdqVg",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTcyODM5MzE2NywiaWF0IjoxNzI4MzA2NzY3LCJqdGkiOiIwM2ZjOGFhMGU2YjM0MDIxOGIxMjc1NTgzNDdkNDIwMCIsInVzZXJfaWQiOjJ9.DjGBpe8PJ079fVT-aJ4-JY-wu__nB2DJwKXUch-phc4"
}
雖然我們將這組 token 發給 client ,但我們之前寫的的 hello_world api,是沒有驗證 request 的有效性的。今天的這一篇,我們來加上驗證。
開始在 api/views.py 進行修改,記得 import 對應的 lib,並把 hello_world 改成這樣
from django.contrib.auth import authenticate
from django.http import JsonResponse
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework_simplejwt.tokens import RefreshToken
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def hello_world(request):
return Response({"message": "Hello, World!"})
現在,試著用 postman 打一下 hello_world,你會得到 401 error,表示沒有權限打這隻 api。
401 是 Unauthorized,你可以在 https://en.wikipedia.org/wiki/List_of_HTTP_status_codes 這邊去查各種 error 代表的意思。
現在,我們將一組從 login 得到的 jwt 放進 header。可以正常呼叫 hello_world
如果 token 過期,也會得到 401,只是 error message 會不一樣
{
"detail": "Given token not valid for any token type",
"code": "token_not_valid",
"messages": [
{
"token_class": "AccessToken",
"token_type": "access",
"message": "Token is invalid or expired"
}
]
}